home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TPUG - Toronto PET Users Group
/
TPUG Users Group CD
/
TPUG Users Group CD.iso
/
AMIGA
/
AMICUS
/
AMICUS13.ADF
/
FutureSound
/
future.asm
< prev
next >
Wrap
Assembly Source File
|
1986-08-05
|
12KB
|
436 lines
************************************************************************
* *
* FUTURE.ASM *
* *
* Copyright (C) 1985, Commodore Amiga Inc. All rights reserved. *
* *
* Portions copyright 1986 Applied Visions, 15 Oak Ridge Road, *
* Medford, Mass. 02155 (617) 488-3602 *
* *
************************************************************************/
*************************************************************************
*
* future sound library source
* based on mylib.asm, from RKM 1.1 Vol. 2 Appendix, and Errata 1.1 disk
*
* V1.0 by John Foust, for Applied Visions, 22-Jun-86.
*
* Source Control
* ------ -------
*
* $Header: amain.asm,v 31.3 86/06/20 18:58:00 jjf Exp $
*
* $Locker: john foust $
*
* $Log: amain.asm,v $
*
************************************************************************/
SECTION text,CODE
NOLIST
include "exec/types.i"
include "exec/nodes.i"
include "exec/lists.i"
include "exec/libraries.i"
include "exec/alerts.i"
include "exec/initializers.i"
include "exec/resident.i"
include "libraries/dos.i"
include "asmsupp.i"
include "future.i"
LIST
;------ These don't have to be external, but it helps some
;------ debuggers to have them globally visible
XDEF Init
XDEF Open
XDEF Close
XDEF Expunge
XDEF Null
XDEF myName
; These are the external Lattice C functions for FutureSound
; They were compiled with stack checking off, with '-v' on lc2.
XDEF FSGetSize
XDEF FSLoadSound
XDEF FSPlaySound
XDEF FSStopSound
XREF _GetSize
XREF _LoadSound
XREF _PlaySound
XREF _StopSound
; These are used by the library for the startup code.
XREF _AbsExecBase
XLIB OpenLibrary
XLIB CloseLibrary
XLIB Alert
XLIB FreeMem
XLIB Remove
; The first executable location. This should return an error
; in case someone tried to run you as a program (instead of
; loading you as a library).
Start:
CLEAR d0
rts
;-----------------------------------------------------------------------
; A romtag structure. Both "exec" and "ramlib" look for
; this structure to discover magic constants about you
; (such as where to start running you from...).
;-----------------------------------------------------------------------
; Most people will not need a priority and should leave it at zero.
; the RT_PRI field is used for configuring the roms. Use "mods" from
; wack to look at the other romtags in the system
MYPRI EQU 0
initDDescrip:
;STRUCTURE RT,0
DC.W RTC_MATCHWORD ; UWORD RT_MATCHWORD
DC.L initDDescrip ; APTR RT_MATCHTAG
DC.L EndCode ; APTR RT_ENDSKIP
DC.B RTF_AUTOINIT ; UBYTE RT_FLAGS
DC.B VERSION ; UBYTE RT_VERSION
DC.B NT_LIBRARY ; UBYTE RT_TYPE
DC.B MYPRI ; BYTE RT_PRI
DC.L myName ; APTR RT_NAME
DC.L idString ; APTR RT_IDSTRING
DC.L Init ; APTR RT_INIT
; LABEL RT_SIZE
; this is the name that the library will have
myName: FSLIBNAME
; a major version number.
VERSION: EQU 1
; A particular revision. This should uniquely identify the bits in the
; library. I use a script that advances the revision number each time
; I recompile. That way there is never a question of which library
; that really is.
REVISION: EQU 1
; this is an identifier tag to help in supporting the library
; format is 'name version.revision (dd MON yyyy)',<cr>,<lf>,<null>
idString: dc.b 'future 1.0 (20 JUN 1986)',13,10,0
dosName: DOSNAME
; force word allignment
ds.w 0
; The romtag specified that we were "RTF_AUTOINIT". This means
; that the RT_INIT structure member points to one of these
; tables below. If the AUTOINIT bit was not set then RT_INIT
; would point to a routine to run.
Init:
DC.L MyLib_Sizeof ; data space size
DC.L funcTable ; pointer to function initializers
DC.L dataTable ; pointer to data initializers
DC.L initRoutine ; routine to run
funcTable:
;------ standard system routines
dc.l Open
dc.l Close
dc.l Expunge
dc.l Null
;------ my library function table
dc.l FSGetSize
dc.l FSLoadSound
dc.l FSPlaySound
dc.l FSStopSound
;------ function table end marker
dc.l -1
; The data table initializes static data structures.
; The format is specified in exec/InitStruct routine's
; manual pages. The INITBYTE/INITWORD/INITLONG routines
; are in the file "exec/initializers.i". The first argument
; is the offset from the library base for this byte/word/long.
; The second argument is the value to put in that cell.
; The table is null terminated
dataTable:
INITBYTE LH_TYPE,NT_LIBRARY
INITLONG LN_NAME,myName
INITBYTE LIB_FLAGS,LIBF_SUMUSED!LIBF_CHANGED
INITWORD LIB_VERSION,VERSION
INITWORD LIB_REVISION,REVISION
INITLONG LIB_IDSTRING,idString
DC.L 0
; This routine gets called after the library has been allocated.
; The library pointer is in D0. The segment list is in A0.
; And A6 holds an exec pointer.
; If it returns non-zero then the library will be linked into
; the library list.
initRoutine:
;------ get the library pointer into a convenient A register, A5
move.l a5,-(sp)
move.l d0,a5
;------ save a pointer to exec
move.l a6,ml_SysLib(a5)
; and save an exec pointer for Lattice, too.
move.l a6,_SysBase
;------ save a pointer to our loaded code
move.l a0,ml_SegList(a5)
;------ open the dos library
lea dosName(pc),a1
CLEAR d0
CALLSYS OpenLibrary
move.l d0,ml_DosLib(a5)
; and save a Dos pointer for Lattice, too.
move.l d0,_DOSBase
bne.s 1$
;------ can't open the dos! what gives
ALERT AG_OpenLib!AO_DOSLib
1$:
; Build and initialize all application-specific data.
; Aside from having the _SysBase and _DOSBase variables set, Lattice
; code compiled with the '-v' option on pass 2 doesn't need any other
; setup - if you don't use any special Lattice functions.
; final library cleanup before exiting Init routine.
; restore A5 to be a pointer to our library, like what we got to start.
; Since this is non-zero, we will be added to the library list.
move.l a5,d0
move.l (sp)+,a5
rts
;----------------------------------------------------------------------
; Here begins the system interface commands. When the user calls
; OpenLibrary/CloseLibrary/RemoveLibrary, this eventually gets translated
; into a call to the following routines (Open/Close/Expunge). Exec
; has already put our library pointer in A6 for us. Exec has turned
; off task switching while in these routines (via Forbid/Permit), so
; we should not take too long in them.
;----------------------------------------------------------------------
; Open returns the library pointer in d0 if the open
; was successful. If the open failed then null is returned.
; It might fail if we allocated memory on each open, or
; if only open application could have the library open
; at a time...
Open: ; ( libptr:a6, version:d0 )
;------ mark us as having another opener
addq.w #1,LIB_OPENCNT(a6)
;------ prevent delayed expunges
bclr #LIBB_DELEXP,ml_Flags(a6)
move.l a6,d0
rts
; There are two different things that might be returned from
; the Close routine. If the library is no longer open and
; there is a delayed expunge then Close should return the
; segment list (as given to Init). Otherwise close should
; return NULL.
Close: ; ( libptr:a6 )
;------ set the return value
CLEAR d0
;------ mark us as having one fewer openers
subq.w #1,LIB_OPENCNT(a6)
;------ see if there is anyone left with us open
bne.s 1$
;------ see if we have a delayed expunge pending
btst #LIBB_DELEXP,ml_Flags(a6)
beq.s 1$
;------ do the expunge
bsr Expunge
1$:
rts
; There are two different things that might be returned from
; the Expunge routine. If the library is no longer open
; then Expunge should return the segment list (as given to
; Init). Otherwise Expunge should set the delayed expunge
; flag and return NULL.
;
; One other important note: because Expunge is called from
; the memory allocator, it may NEVER Wait() or otherwise
; take long time to complete.
Expunge: ; ( libptr: a6 )
movem.l d2/a5/a6,-(sp)
move.l a6,a5
move.l ml_SysLib(a5),a6
;------ see if anyone has us open
tst.w LIB_OPENCNT(a5)
beq 1$
;------ it is still open. set the delayed expunge flag
bset #LIBB_DELEXP,ml_Flags(a5)
CLEAR d0
bra.s Expunge_End
1$:
;------ go ahead and get rid of us. Store our seglist in d2
move.l ml_SegList(a5),d2
;------ unlink from library list
move.l a5,a1
CALLSYS Remove
; now perform application-specific cleanup
; nothing to clean up from Lattice as specified above.
; continue the library cleanup
;------ close the dos library
move.l ml_DosLib(a5),a1
CALLSYS CloseLibrary
;------ free our memory
CLEAR d0
move.l a5,a1
move.w LIB_NEGSIZE(a5),d0
sub.l d0,a1
add.w LIB_POSSIZE(a5),d0
CALLSYS FreeMem
;------ set up our return value
move.l d2,d0
Expunge_End:
movem.l (sp)+,d2/a5/a6
rts
Null:
CLEAR d0
rts
;----------------------------------------------------------------------
; Here begins the library specific commands
;----------------------------------------------------------------------
; Lattice places the function arguments on the stack in right-to-left
; declaration order, so the CALLED function takes them off in natural
; order. So, here we take the register values as specified in
; 'future_lib.fd,' and put them on the stack for Lattice.
; Lattice function return values are in D0 in these functions
; ULONG GetSize(filename) (A0)
; char *filename;
;
; ULONG error code returned in D0.L
FSGetSize:
move.l a0,-(a7)
jsr _GetSize
add.w #4,a7
rts
; UWORD LoadSound(filename,buffer) (D0,A0)
; char *filename;
; char *buffer;
;
; recording rate returned in D0
FSLoadSound:
move.l a0,-(a7)
move.l d0,-(a7)
jsr _LoadSound
add.w #8,a7
rts
; struct IOAudio *PlaySound(buffer,buflen,repeat,period,volume) (A0,D0-D3)
; BYTE *buffer;
; ULONG buflen;
; long repeat,
; period,
; volume;
;
; struct IOAudio pointer returned in D0.L
FSPlaySound:
movem.l d0/d1/d2/d3,-(a7) ; D3 is pushed first
move.l a0,-(a7)
jsr _PlaySound
add.w #20,a7
rts
; StopSound(ioa) (A0)
; struct IOAudio *ioa;
;
; no return value
FSStopSound:
move.l a0,-(a7)
jsr _StopSound
moveq #0,d0
add.w #4,a7
rts
; Lattice data for these functions.
XDEF _DOSBase,_SysBase
_SysBase DC.L 0
_DOSBase DC.L 0
; EndCode is a marker that show the end of your code.
; Make sure it does not span sections nor is before the
; rom tag in memory! It is ok to put it right after
; the rom tag -- that way you are always safe. I put
; it here because it happens to be the "right" thing
; to do, and I know that it is safe in this case.
EndCode:
END